/* CSP-201803P4 棋局评估（博弈、搜索）
时间限制：	1.0s
内存限制：	256.0MB

9个格子，双方总共最多走9步必然终局。

按走法记录：
给每个格子编号0~8，4-bits即可描述1步下法，需要4*9=36位，用long long描述。
局面组合共9!=362880种，实际更少，很多中途就分出胜负了。
考虑对称性则更少。

按局面记录：
每格3种状态：空(00)、X(01)、O(10)，需要2位。局面2*9=18~32位，用1个int即可保存。
3^9=19683种局面，实际更少。
*/
#include <iostream>
using namespace std;

const int INF = -999;
int v[3][3];

bool win(int x){ // 判断棋局中x型棋子是否三连
  if(v[0][0] == x && v[0][1] == x && v[0][2] == x){ return true; } // 横
  if(v[1][0] == x && v[1][1] == x && v[1][2] == x){ return true; }
  if(v[2][0] == x && v[2][1] == x && v[2][2] == x){ return true; }
  if(v[0][0] == x && v[1][0] == x && v[2][0] == x){ return true; } // 纵
  if(v[0][1] == x && v[1][1] == x && v[2][1] == x){ return true; }
  if(v[0][2] == x && v[1][2] == x && v[2][2] == x){ return true; }
  if(v[0][0] == x && v[1][1] == x && v[2][2] == x){ return true; } // 对角
  if(v[0][2] == x && v[1][1] == x && v[2][0] == x){ return true; }
  return false;
}

void dump(const string& ident){
  for(int r = 0; r < 3; ++r){
    cout << ident;
    for(int c = 0; c < 3; ++c){
      cout << v[r][c];
    }
    cout << endl;
  }
}

int check(int x, int space){
  // 0平局，>0胜利，<0失败
  const int y = (x == 1 ? 2 : 1);
  if(win(x)){
    return space + 1; // 棋局评分
  }
  if(win(y)){ // 对方胜
    return -(space + 1);
  }
  int mx = INF;
  for(int r = 0; r < 3; ++r){
    for(int c = 0; c < 3; ++c){
      if(v[r][c] == 0){ // 发现空白就递归搜索
        v[r][c] = x;
        mx = max(mx, -check(y, space - 1)); // 对方的评分取负就是该局面我方评分
        v[r][c] = 0; // 还原
      }
    }
  }
  return (mx == INF ? 0 : mx); // 若分数没有变动，双方都没取胜，平局。可胜可负。
}

int main(){
  int n = 0;
  cin >> n;
  for(; n; --n){
    int space = 0;
    for(int r = 0; r < 3; ++r){
      for(int c = 0; c < 3; ++c){
        cin >> v[r][c];// 0=空 1=X 2=O
        if(v[r][c] == 0){ ++space; }
      }
    }
    cout << check(1, space) << endl; // 总是1号行棋。
  }
}
